package com.happy.unitconvert.common.util;

import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.regex.Pattern;

/**
 * 数值工具类
 */
public class NumberUtils {

  private static final Pattern NUMBER_PATTERN = Pattern.compile("^-?\\d+(\\.\\d+)?$");
  private static final DecimalFormat DEFAULT_FORMAT = new DecimalFormat("#.##########");

  /**
   * 检查字符串是否为有效数字
   */
  public static boolean isValidNumber(String str) {
    if (!StringUtils.hasText(str)) {
      return false;
    }
    return NUMBER_PATTERN.matcher(str.trim()).matches();
  }

  /**
   * 安全地将字符串转换为BigDecimal
   */
  public static BigDecimal toBigDecimal(String str) {
    if (!isValidNumber(str)) {
      throw new IllegalArgumentException("无效的数字格式: " + str);
    }
    return new BigDecimal(str.trim());
  }

  /**
   * 安全地将Object转换为BigDecimal
   */
  public static BigDecimal toBigDecimal(Object obj) {
    if (obj == null) {
      return BigDecimal.ZERO;
    }
    if (obj instanceof BigDecimal) {
      return (BigDecimal) obj;
    }
    if (obj instanceof Number) {
      return BigDecimal.valueOf(((Number) obj).doubleValue());
    }
    return toBigDecimal(obj.toString());
  }

  /**
   * 四舍五入到指定小数位数
   */
  public static BigDecimal round(BigDecimal value, int scale) {
    if (value == null) {
      return BigDecimal.ZERO;
    }
    return value.setScale(scale, RoundingMode.HALF_UP);
  }

  /**
   * 格式化数字，自动去除尾随零
   */
  public static String format(BigDecimal value) {
    if (value == null) {
      return "0";
    }
    return DEFAULT_FORMAT.format(value);
  }

  /**
   * 格式化数字到指定小数位数
   */
  public static String format(BigDecimal value, int scale) {
    if (value == null) {
      return "0";
    }
    return round(value, scale).toPlainString();
  }

  /**
   * 比较两个BigDecimal是否相等（忽略小数位数）
   */
  public static boolean equals(BigDecimal a, BigDecimal b) {
    if (a == null && b == null) {
      return true;
    }
    if (a == null || b == null) {
      return false;
    }
    return a.compareTo(b) == 0;
  }

  /**
   * 检查数值是否为正数
   */
  public static boolean isPositive(BigDecimal value) {
    return value != null && value.compareTo(BigDecimal.ZERO) > 0;
  }

  /**
   * 检查数值是否为零或正数
   */
  public static boolean isNonNegative(BigDecimal value) {
    return value != null && value.compareTo(BigDecimal.ZERO) >= 0;
  }

  /**
   * 获取两个数值中的最大值
   */
  public static BigDecimal max(BigDecimal a, BigDecimal b) {
    if (a == null)
      return b;
    if (b == null)
      return a;
    return a.compareTo(b) >= 0 ? a : b;
  }

  /**
   * 获取两个数值中的最小值
   */
  public static BigDecimal min(BigDecimal a, BigDecimal b) {
    if (a == null)
      return b;
    if (b == null)
      return a;
    return a.compareTo(b) <= 0 ? a : b;
  }
}
